home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 2 / Atari Mega Archive CD - Volume 2.iso / minix / up1510b.tgz / up1510b / src / test / test16.c < prev    next >
C/C++ Source or Header  |  1990-07-20  |  5KB  |  315 lines

  1. /* test 16 */
  2.  
  3. #include <signal.h>
  4. #include <errno.h>
  5. #include <stdio.h>
  6.  
  7. #define MAX_ERROR 4
  8.  
  9. extern int errno;
  10. int errct, subtest;
  11.  
  12.  
  13. int func1(), func10(), func8(), funcalrm(), func11();
  14. int childsigs, parsigs, alarms;
  15. int zero[1024];
  16.  
  17. main()
  18. {
  19.   int i;
  20.  
  21.   printf("Test 16 ");
  22.   fflush(stdout);        /* have to flush for child's benefit */
  23.  
  24.   for (i = 0; i < 1; i++) {
  25.     test50();
  26.     test51();
  27.     test53();
  28.     test54();
  29.     test55();
  30. /*    test56(); */
  31.     test57();
  32.   }
  33.   if (errct == 0)
  34.     printf("ok\n");
  35.   else
  36.     printf("%d errors\n", errct);
  37.   exit(0);
  38. }
  39.  
  40.  
  41. test50()
  42. {
  43.   int parpid, childpid, flag, *zp;
  44.  
  45.   flag = 0;
  46.   for (zp = &zero[0]; zp < &zero[1024]; zp++)
  47.     if (*zp != 0) flag = 1;
  48.   if (flag) e(0);        /* check if bss is cleared to 0 */
  49.   if (signal(1, func1) < 0) e(1);
  50.   if (signal(10, func10) < 0) e(2);
  51.   parpid = getpid();
  52.   if (childpid = fork()) {
  53.     if (childpid < 0) ex();
  54.     parent(childpid);
  55.   } else {
  56.     child(parpid);
  57.   }
  58.   if (signal(1, SIG_DFL) < 0) e(4);
  59.   if (signal(10, SIG_DFL) < 0) e(5);
  60. }
  61.  
  62. parent(childpid)
  63. int childpid;
  64. {
  65.   int i;
  66.  
  67.   for (i = 0; i < 3; i++) {
  68.     if (kill(childpid, 1) < 0) e(6);
  69.     while (parsigs == 0);
  70.     parsigs--;
  71.   }
  72.   if (wait(&i) < 0) e(7);
  73.   if (i != 256 * 6) e(8);
  74. }
  75.  
  76. child(parpid)
  77. int parpid;
  78. {
  79.  
  80.   int i;
  81.  
  82.   for (i = 0; i < 3; i++) {
  83.     while (childsigs == 0);
  84.     childsigs--;
  85.     if (kill(parpid, 10) < 0) e(9);
  86.   }
  87.   exit(6);
  88. }
  89.  
  90. func1()
  91. {
  92.   if (signal(1, func1) < 0) e(10);
  93.   childsigs++;
  94. }
  95.  
  96. func10()
  97. {
  98.   if (signal(10, func10) < 0) e(11);
  99.   parsigs++;
  100. }
  101.  
  102.  
  103. test51()
  104. {
  105.   int cpid, n, pid;
  106.  
  107.   if ((pid = fork())) {
  108.     if (pid < 0) ex();
  109.     if ((pid = fork())) {
  110.         if (pid < 0) ex();
  111.         if (cpid = fork()) {
  112.             if (cpid < 0) ex();
  113.             if (kill(cpid, 9) < 0) e(12);
  114.             if (wait(&n) < 0) e(13);
  115.             if (wait(&n) < 0) e(14);
  116.             if (wait(&n) < 0) e(15);
  117.         } else {
  118.             pause();
  119.             while (1);
  120.         }
  121.     } else {
  122.         exit(0);
  123.     }
  124.   } else {
  125.     exit(0);
  126.   }
  127. }
  128.  
  129. test52()
  130. {
  131.   int pid, n, k;
  132.  
  133.   pid = getpid();
  134.   if (getpid() == pid) k = fork();    /* only parent forks */
  135.   if (k < 0) ex();
  136.   if (getpid() == pid) k = fork();    /* only parent forks */
  137.   if (k < 0) ex();
  138.   if (getpid() == pid) k = fork();    /* only parent forks */
  139.   if (k < 0) ex();
  140.  
  141.   if (getpid() == pid) {
  142.     if (kill(0, 9) < 0) e(16);
  143.     if (wait(&n) < 0) e(17);
  144.     if (wait(&n) < 0) e(18);
  145.     if (wait(&n) < 0) e(19);
  146.   } else
  147.     pause();
  148. }
  149.  
  150. int sigmap[5] = {9, 10, 11};
  151. test53()
  152. {
  153.   int n, i, pid, wpid;
  154.  
  155.   /* Test exit status codes for processes killed by signals. */
  156.   for (i = 0; i < 3; i++) {
  157.     if (pid = fork()) {
  158.         if (pid < 0) ex();
  159.         sleep(3);    /* wait for child to pause */
  160.         if (kill(pid, sigmap[i]) < 0) {
  161.             e(20);
  162.             exit(1);
  163.         }
  164.         if ((wpid = wait(&n)) < 0) e(21);
  165.         if ((n & 077) != sigmap[i]) e(22);
  166.         if (pid != wpid) e(23);
  167.     } else {
  168.         pause();
  169.         exit(0);
  170.     }
  171.   }
  172. }
  173.  
  174. test54()
  175. {
  176. /* Test alarm */
  177.  
  178.   int i;
  179.  
  180.   alarms = 0;
  181.   for (i = 0; i < 8; i++) {
  182.     signal(SIGALRM, funcalrm);
  183.     alarm(1);
  184.     pause();
  185.     if (alarms != i + 1) e(24);
  186.   }
  187. }
  188.  
  189.  
  190.  
  191. test55()
  192. {
  193. /* When a signal knocks a processes out of WAIT or PAUSE, it is supposed to
  194.  * get EINTR as error status.  Check that.
  195.  */
  196.   int n, j, i;
  197.  
  198.   if (signal(8, func8) < 0) e(25);
  199.   if (n = fork()) {
  200.     /* Parent must delay to give child a chance to pause. */
  201.     if (n < 0) ex();
  202.     sleep(1);
  203.     if (kill(n, 8) < 0) e(26);
  204.     if (wait(&n) < 0) e(27);
  205.     if (signal(8, SIG_DFL) < 0) e(28);
  206.   } else {
  207.     j = pause();
  208.     if (errno != EINTR && -errno != EINTR) e(29);
  209.     exit(0);
  210.   }
  211. }
  212.  
  213. func8()
  214. {
  215. }
  216.  
  217. test56()
  218. {
  219.   int i, j, k, n;
  220.  
  221.   n = fork();
  222.   if (n < 0) ex();
  223.   if (n) {
  224.     wait(&i);
  225.     i = (i >> 8) & 0377;
  226.     if (i != (n & 0377)) e(30);
  227.   } else {
  228.     i = getgid();
  229.     j = getegid();
  230.     k = (i + j + 7) & 0377;
  231.     if (setgid(k) < 0) e(31);
  232.     if (getgid() != k) e(32);
  233.     if (getegid() != k) e(33);
  234.     i = getuid();
  235.     j = geteuid();
  236.     k = (i + j + 1) & 0377;
  237.     if (setuid(k) < 0) e(34);
  238.     if (getuid() != k) e(35);
  239.     if (geteuid() != k) e(36);
  240.     i = getpid() & 0377;
  241.     if (wait(&j) != -1) e(37);
  242.     exit(i);
  243.   }
  244. }
  245.  
  246. func11()
  247. {
  248.   e(38);
  249. }
  250.  
  251.  
  252. test57()
  253. {
  254.   int n;
  255.  
  256.   signal(11, func11);
  257.   signal(11, SIG_IGN);
  258.   n = getpid();
  259.   kill(n, 11);
  260.   signal(11, SIG_DFL);
  261. }
  262.  
  263. funcalrm()
  264. {
  265.   alarms++;
  266. }
  267.  
  268.  
  269. test58()
  270. {
  271. /* When a signal knocks a processes out of PIPE, it is supposed to
  272.  * get EINTR as error status.  Check that.
  273.  */
  274.   int n, j, i, fd[2];
  275.  
  276.   if (signal(8, func8) < 0) e(38);
  277.   pipe(fd);
  278.   if (n = fork()) {
  279.     /* Parent must delay to give child a chance to pause. */
  280.     if (n < 0) ex();
  281.     sleep(3);
  282.     if (kill(n, 8) < 0) e(39);
  283.     if (wait(&n) < 0) e(40);
  284.     if (signal(8, SIG_DFL) < 0) e(41);
  285.     close(fd[0]);
  286.     close(fd[1]);
  287.   } else {
  288.     j = read(fd[0], &n, 1);
  289.     if (errno != EINTR) e(42);
  290.     exit(0);
  291.   }
  292. }
  293.  
  294. ex()
  295. {
  296.   printf("Test 16.  fork failed.  Errno=%d\n", errno);
  297.   exit(1);
  298. }
  299.  
  300.  
  301.  
  302. e(n)
  303. int n;
  304. {
  305.   int err_num = errno;        /* save errno in case printf clobbers it */
  306.  
  307.   printf("Subtest %d,  error %d  errno=%d  ", subtest, n, errno);
  308.   errno = err_num;        /* restore errno, just in case */
  309.   perror("");
  310.   if (errct++ > MAX_ERROR) {
  311.     printf("Too many errors; test aborted\n");
  312.     exit(1);
  313.   }
  314. }
  315.